perm filename VIEWER.OLD[G,BGB]1 blob sn#054456 filedate 1973-07-23 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00019 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00003 00002	TITLE VIEWER  -  IMAGE FORMING SUBROUTINES  -  JULY 1972.
C00005 00003	SUBR(SHOW1,WND,POG)		DISPLAY ALL EDGES IN VIEW.
C00007 00004	SUBR(SHOW2,WND,POG)	 	VECTOR HIDDEN LINE IMAGE.
C00010 00005	SUBR(CROP)WINDOW
C00012 00006	SUBR(PPROJ)CAMERA,WORLD
C00015 00007	SUBR(VPROJ,VERTEX)		TRANSLATE VERTEX TO CAMERA LOCUS.
C00018 00008	SUBR(UNPROJECT,VERTEX)
C00021 00009	SUBR(FACOEF,BF,FLAG)		FACE COEFFICIENTS.
C00024 00010	SUBR(ENORM,BODY)	     COMPUTE EDGE NORMALS FROM FACE NORMALS.
C00026 00011	SUBR(ZCLIPF,FACE)
C00028 00012	SUBR(FMRK,WORLD)		MARK POTENT FACES.
C00031 00013	SUBR(EMRK,WORLD)		MARK POTENT EDGES FOR OCCULT.
C00034 00014	SUBR(ZCLIP)V1,U,V2
C00039 00015	SUBR(XYCLIP)
C00041 00016	XY-CLIPPER continued.
C00043 00017	SUBR(CLIPER,WINDOW)
C00045 00018	FOR ALL THE BODIES.
C00047 00019	
C00063 ENDMK
C⊗;
TITLE VIEWER  -  IMAGE FORMING SUBROUTINES  -  JULY 1972.

	EXTERN OTHER,VCW,VCCW,ECCW
	EXTERN KLJUTS,KLJOTS,KLTMPS
	EXTERN IIIDPY,UNIVERSE,DPYFLG

;VARIABLES GLOBAL TO VIEWER SUBROUTINES.
	DECLARE{XL,XH,YL,YH}
	DECLARE{FOCAL,LDZ}
	DECLARE{SCALEX,SCALEY,SCALEZ}
	DECLARE{SOX,SOY,MAG}
	DECLARE{CAMFRAME}

	DECLARE{ZCCMIN}
	DECLARE{FOLDCNT,EDGECNT}

	DECLARE{CAMERA,WINDOW,WORLD,GLASS}
	DECLARE{ALLSHARP}

SUBR(GEODPY)		;GEOMED'S DISPLAY REFRESH
;--------------------------------------------------------------------
	LACI 1↔DAC GLASS#
	LAC 1,UNIVERSE
	CW  1,1↔DAC 1,W0	;FIRST WINDOW OF DISPLAY RING.
L1:	DAC 1,W
	PUSH P,1↔PUSH P,GLASS
	LAC 1,DPYFLG
	PUSHJ P,@[SHOW2↔SHOW3↔SHOW1↔SHOW4](1)
	AOS GLASS

L2:	LAC 1,W↔SIS 1,1		;NEXT WINDOW OF THE NOW DISPLAY RING.
	CAME 1,W0↔GO L1
	POP0J
	DECLARE{W,W0}

ENDR GEODPY;7/12/73(BGB)---------------------------------------------
SUBR(SHOW1,WND,POG)		;DISPLAY ALL EDGES IN VIEW.
COMMENT ⊗---------------------------------------------------------
⊗
	SETOM ALLSHARP
	LAC 1,WND↔DAC 1,WINDOW
	NCAMR 1,1↔DAC 1,CAMERA↔JUMPE 1,POP2J.
	PWRLD 1,1↔DAC 1,WORLD ↔JUMPE 1,POP2J.
	CALL(PPROJ,CAMERA,WORLD)
	CALL(EMRKALL,WORLD)
	CALL(CLIPER,WINDOW)
	CALL(IIIDPY,WINDOW,POG)
	POP2J
ENDR SHOW1;3/16/73(BGB)-------------------------------------------

SUBR(SHOW3,WND,POG)	 	;DISPLAY BACKSIDED FACES REMOVED.
COMMENT ⊗-------------------------------------------------------
⊗↔	SETZM ALLSHARP
	LAC 1,WND↔DAC 1,WINDOW
	NCAMR 1,1↔DAC 1,CAMERA↔JUMPE 1,POP2J.
	PWRLD 1,1↔DAC 1,WORLD ↔JUMPE 1,POP2J.
	CALL(PPROJ,CAMERA,WORLD)
	CALL(FMRK,WORLD)
	CALL(EMRK,WORLD)
	CALL(CLIPER,WINDOW)
	CALL(IIIDPY,WINDOW,POG)
	POP2J
ENDR SHOW3;3/16/73(BGB)-------------------------------------------
SUBR(SHOW2,WND,POG)	 	;VECTOR HIDDEN LINE IMAGE.
COMMENT ⊗------------------------------------------------------------
⊗
	SETZM ALLSHARP
	LAC 1,WND↔DAC 1,WINDOW
	NCAMR 1,1↔DAC 1,CAMERA↔JUMPE 1,POP2J.
	PWRLD 1,1↔DAC 1,WORLD ↔JUMPE 1,POP2J.
	CALL(PPROJ,CAMERA,WORLD)
	CALL(FMRK,WORLD)
	CALL(EMRK,WORLD)
	CALL(OCCULT↑,WORLD)
	CALL(KLJOTS,WORLD)
	CALL(CLIPER,WINDOW)
	CALL(IIIDPY,WINDOW,POG)
	CALL(KLTMPS,WORLD)
	POP2J
ENDR SHOW2;3/16/73(BGB)----------------------------------------------

SUBR(SHOW4,WND,POG)		;RUN OCCULT DIAGONOSTICS.
COMMENT ⊗------------------------------------------------------------
⊗
	SETZM ALLSHARP
	LAC 1,WND↔DAC 1,WINDOW
	NCAMR 1,1↔DAC 1,CAMERA↔JUMPE 1,POP2J.
	PWRLD 1,1↔DAC 1,WORLD ↔JUMPE 1,POP2J.
	CALL(PPROJ,CAMERA,WORLD)
	CALL(FMRK,WORLD)
	CALL(EMRK,WORLD)
	CALL({OCCULT↑+1},WORLD)
	CALL(KLJOTS,WORLD)
	CALL(CLIPER,WINDOW)
	CALL(IIIDPY,WINDOW,POG)
	CALL(KLTMPS,WORLD)
	POP2J
ENDR SHOW4;2/12/73(BGB)----------------------------------------------

SUBR(TAKE,CAMR)			;SIMULATED TAKE A PICTURE.
COMMENT ⊗------------------------------------------------------------
⊗	DZM ALLSHARP
	LAC 1,CAMR↔DAC 1,CAMERA↔JUMPE 1,POP1J.
	PWRLD 1,1↔DAC 1,WORLD ↔JUMPE 1,POP2J.
	CALL(PPROJ,CAMERA,WORLD)
	CALL(FMRK,WORLD)
	CALL(EMRK,WORLD)
	CALL(OCCULT↑,WORLD)
	CALL(SIMAGE↑,CAMERA)	;MAKE A SIMULATED IMAGE.
	CALL(KLTMPS,WORLD)
	POP1J
ENDR TAKE;7/14/73(BGB)-----------------------------------------------
SUBR(CROP)WINDOW
COMMENT ⊗------------------------------------------------------------
Crop object window to III destination window.
; XL ← (OX - MAG*LDX) MAX -511.
; XH ← (OX + MAG*LDX) MIN +511.
; YL ← (OY - MAG*LDY) MAX -384.
; YH ← (OY + MAG*LDY) MIN +384.
⊗↔	ACCUMULATORS{WND,C,OX,OY,LDX,LDY,MAG}
	LAC WND,ARG1
	ALT C,WND↔JUMPE C,POP1J.
	LAC MAG,-1(WND)
	NIP OX,-2(WND)↔FLOAT OX,
	NAP OY,-2(WND)↔FLOAT OY,
	NAP LDX,1(C)↔FLOAT LDX,
	NAP LDY,2(C)↔FLOAT LDY,

	LAC LDX↔FMPR MAG↔DAC OX,1
	FSBR 1,0↔FADR 0,OX↔FIXX 0,↔FIXX 1,
	CAMGE 1,[-=511]↔LAC 1,[-=511]↔DIP 1,1(WND)
	CAMLE 0,[ =511]↔LAC 0,[ =511]↔DAP 0,1(WND)

	LAC LDY↔FMPR MAG↔DAC OY,1
	FSBR 1,0↔FADR 0,OY↔FIXX 0,↔FIXX 1,
	CAMGE 1,[-=384]↔LAC 1,[-=384]↔DIP 1,2(WND)
	CAMLE 0,[ =384]↔LAC 0,[ =384]↔DAP 0,2(WND)

	POP1J
ENDR CROP;3/13/73(BGB)--------------------------------------------
SUBR(PPROJ)CAMERA,WORLD
COMMENT ⊗------------------------------------------------------------
⊗↔	ACCUMULATORS{B,F,E,V,CAM,E0,X,XX,Y,YY,Z,ZZ}
	LAC B,ARG1↔$TYPE 0,B↔CAIE $WORLD↔POP2J
;CLEAR FACE PZZ & NZZ BITS.
	LAC B,ARG1
I0:	CCW B,B↔TESTZ B,BBIT↔GO[LAC F,B
I1:	PFACE F,F↔TEST F,FBIT↔GO I0↔MARKZ F,PZZ∨NZZ↔GO I1]

;GET CAMERA SCALES AND FOCAL.
	LAC CAM,ARG2
	LAC -3(CAM)↔DAC SCALEX
	LAC -2(CAM)↔DAC SCALEY
	LAC -1(CAM)↔DAC SCALEZ
	HLLZ 3(CAM)↔DAC FOCAL
	CDR 3(CAM)↔FLOAT↔DAC LDZ

;GET THE CAMERA'S FRAME.
	LAC CAM,ARG2
	FRAME CAM,CAM
	DAC CAM,CAMFRAME

;FOR ALL THE BODIES OF THE WORLD.
	LAC B,ARG1
L1:	CCW B,B↔TEST B,BBIT↔POP2J
	MARKZ B,VISIBLE

;FOR ALL THE VERTICES OF EACH BODY.
	LAC V,B
L2:	PVT V,V
	TEST V,VBIT↔GO L1
	ZIP 7(V); CLEAR POTENT VALENCE.
	CALL(VPROJ+1,V)
;DO Z-CLIP MARKING WRT CAMERA CENTERED COORDINATES.
	LAC X,[JUTBIT+JOTBIT+PZZ+NZZ+FOLDED+VISIBLE+POTENT+TBIT1]
	ANDCAM X,(V)		;TURN 'EM ALL OFF.
	SLACI X,(PZZ)		; + HALFSPACE, BEHIND THE CAMERA.
	MOVN FOCAL
	CAMGE ZZ,0		;SKIP WHEN Zcc ≥ -FOCAL.
	SLACI X,(NZZ)		; - HALFSPACE, INVIEW.
	IORM X,(V)

	PED E,V↔DAC E,E0↔JUMPE E,[
	 PFACE F,B↔IORM X,(F)↔GO L1] ;VERTEX BODY CASE.

L3:	PVT 1,E↔CAME 1,V↔GO .+3↔PCW 1,E↔GO L4	   ;AC1 ← ECCW(E,V).
	NVT 1,E↔CAME 1,V↔GO L2 ↔NCW 1,E
L4:	IORM X,(E)
	PFACE F,E↔IORM X,(F)
	NFACE F,E↔IORM X,(F)
	LAC E,1↔CAME E,E0↔GO L3↔GO L2
ENDR PPROJ;1/14/73(BGB)----------------------------------------------
SUBR(VPROJ,VERTEX)		;TRANSLATE VERTEX TO CAMERA LOCUS.
COMMENT ⊗------------------------------------------------------------
⊗↔	ACCUMULATORS{B,F,E,V,CAM,E0,X,XX,Y,YY,Z,ZZ}
	LAC CAM,CAMFRAME↔LAC V,ARG1

	LAC X,XWC(V)↔FSBR X,XWC(CAM)
	LAC Y,YWC(V)↔FSBR Y,YWC(CAM)
	LAC Z,ZWC(V)↔FSBR Z,ZWC(CAM)
APROJ2:

;ROTATE TO CAMERA ORIENTATION.

	DEFINE ROTATE $(QQ,Q){
	  LAC QQ,X↔ FMPR QQ,Q$X(CAM)
	  LAC Y↔FMPR Q$Y(CAM)↔FADR QQ,
	  LAC Z↔FMPR Q$Z(CAM)↔FADR QQ,}
	ROTATE(XX,I);
	ROTATE(YY,J);
	ROTATE(ZZ,K);

;PERSPECTIVE TRANSFORMATION.

	FMPR XX,SCALEX↔FDVR XX,ZZ↔DAC XX,XPP(V)
	FMPR YY,SCALEY↔FDVR YY,ZZ↔DAC YY,YPP(V)
	MOVN Z,SCALEZ↔FDVR Z,ZZ↔DAC Z,ZPP(V)
	POP1J

↑APROJ:	LAC CAM,CAMFRAME↔LAC V,ARG1		;ARROW PROJECTION.
	LAC X,XPP(V)↔FSBR X,XWC(CAM)
	LAC Y,YPP(V)↔FSBR Y,YWC(CAM)
	LAC Z,ZPP(V)↔FSBR Z,ZWC(CAM)
	GO APROJ2
ENDR VPROJ;(BGB)-----------------------------------------------------
SUBR(UNPROJECT,VERTEX)
COMMENT ⊗------------------------------------------------------------
⊗↔	ACCUMULATORS{V,C,X,Y,Z,XX,YY,ZZ}
	LAC V,VERTEX
	LAC C,CAMFRAME

;UNDO PERSPECTIVE.
	LACN Z,SCALEZ↔FDVR Z,ZPP(V)
	LAC  Y,YPP(V)↔FMPR Y,Z↔FDVR Y,SCALEY
	LAC  X,XPP(V)↔FMPR X,Z↔FDVR X,SCALEX

;ROTATE BY TRANSPOSE OF CAMERA ORIENTATION.
	LAC XX,X↔FMPR XX,IX(C)
	LAC Y↔FMPR JX(C)↔FADR XX,
	LAC Z↔FMPR KX(C)↔FADR XX,

	LAC YY,Y↔FMPR YY,IY(C)
	LAC Y↔FMPR JY(C)↔FADR YY,
	LAC Z↔FMPR KY(C)↔FADR YY,

	LAC ZZ,Z↔FMPR ZZ,IZ(C)
	LAC Y↔FMPR JZ(C)↔FADR ZZ,
	LAC Z↔FMPR KZ(C)↔FADR ZZ,

;TRANSLATE TO CAMERA LOCUS.
	FADR XX,XWC(C)↔DAC XX,XWC(V)
	FADR YY,YWC(C)↔DAC YY,YWC(V)
	FADR ZZ,ZWC(C)↔DAC ZZ,ZWC(V)
	POP1J
ENDR UNPROJECT;1/14/73(BGB)------------------------------------------
SUBR(FACOEF,BF,FLAG)		;FACE COEFFICIENTS.
COMMENT ⊗------------------------------------------------------------
		FLAG=0 FOR WC, FLAG=-1 FOR PP.
⊗
	ACCUMULATORS {Q,E,V1,V2,V3,ABC,F,ARG}
	FOR @% Qε{XYZ}{FOR @$ N←1,3{		;DEFINE X1,Y1,Z1, etc.
	DEFINE Q%$N<Q%WC(V$N)>↔}}
;FOR ALL THE FACES OF EACH BODY.
	LAC F,BF↔LAC ARG,(F) 			;ORIGINAL ARG TYPE.
	TLNN ARG,(BBIT)↔GO L2
L1:	PFACE F,F
	TEST F,FBIT↔POP2J
;FIRST THREE VERTICES CCW ABOUT THE FACE.
L2:	PED E,F↔ZIP 6(F)	;CLEAR ALT LINK (FOR EHIDE TMP).
	SETQ(V1,{VCW,E,F})
	SETQ(V2,{VCCW,E,F})
	SETQ(E,{ECCW,E,F})
	SETQ(V3,{VCCW,E,F})

;FLG TRUE FOR PERSPECTIVE PROJECTED FACOEF.
	SKIPE FLAG↔GO[ADDI V1,7↔ADDI V2,7↔ADDI V3,7↔GO .+1]

;KK(F) ← X1*(Z2*Y3-Y2*Z3) + Y1*(X2*Z3-Z2*X3) + Z1*(Y2*X3-X2*Y3).
	LAC 1,Z2↔FMPR 1,Y3↔LAC Y2↔FMPR Z3↔FSBR 1,0↔FMPR 1,X1
	LAC 2,X2↔FMPR 2,Z3
	LAC Z2↔FMPR X3↔FSBR 2,0↔FMPR 2,Y1↔FADR 1,2
	LAC 3,Y2↔FMPR 3,X3
	LAC X2↔FMPR Y3↔FSBR 3,0↔FMPR 3,Z1↔FADR 1,3
	DAC 1,KK(F)
;AA(F) ← (Z1*(Y2-Y3) + Z2*(Y3-Y1) + Z3*(Y1-Y2)).
	LAC 1,Y2↔FSBR 1,Y3↔FMPR 1,Z1↔LAC 0,1
	LAC 1,Y3↔FSBR 1,Y1↔FMPR 1,Z2↔FADR 0,1
	LAC 1,Y1↔FSBR 1,Y2↔FMPR 1,Z3↔FADR 0,1
	DAC AA(F)↔FMPR↔DAC ABC
;BB(F) ← (X1*(Z2-Z3) + X2*(Z3-Z1) + X3*(Z1-Z2)).
	LAC 1,Z2↔FSBR 1,Z3↔FMPR 1,X1↔LAC 0,1
	LAC 1,Z3↔FSBR 1,Z1↔FMPR 1,X2↔FADR 0,1
	LAC 1,Z1↔FSBR 1,Z2↔FMPR 1,X3↔FADR 0,1
	DAC BB(F)↔FMPR↔FADRM ABC
;CC(F) ← (X1*(Y3-Y2) + X2*(Y1-Y3) + X3*(Y2-Y1)).
	LAC 1,Y3↔FSBR 1,Y2↔FMPR 1,X1↔LAC 0,1
	LAC 1,Y1↔FSBR 1,Y3↔FMPR 1,X2↔FADR 0,1
	LAC 1,Y2↔FSBR 1,Y1↔FMPR 1,X3↔FADR 0,1
	DAC CC(F)↔FMPR↔FADRM ABC
;NORMALIZE.
	CALL(SQRT↑,ABC)↔SLACI(<1.0>)↔FDVR 1
	FMPRM AA(F)↔FMPRM BB(F)↔FMPRM CC(F)↔FMPRM KK(F)
	TLNN ARG,(BBIT)↔POP2J↔GO L1
ENDR FACOEF;1/14/73(BGB)---------------------------------------------
SUBR(ENORM,BODY)	     ;COMPUTE EDGE NORMALS FROM FACE NORMALS.
COMMENT ⊗------------------------------------------------------------
⊗↔ 	ACCUMULATORS{E,F1,F2}
	LAC E,BODY
	PED E,E↔CAMN E,BODY↔POP1J
	PFACE F1,E↔NFACE F2,E
	LAC AA(F1)↔FAD AA(F2)↔FSC -1↔DACN AA(E)
	LAC BB(F1)↔FAD BB(F2)↔FSC -1↔DACN BB(E)
	LAC CC(F1)↔FAD CC(F2)↔FSC -1↔DACN CC(E)
	GO ENORM+1
ENDR ENORM;1/14/73(BGB)----------------------------------------------

SUBR(VNORM,BODY)	;COMPUTE VERTEX NORMALS FROM EDGE NORMALS.
COMMENT ⊗------------------------------------------------------------
⊗↔	ACCUMULATORS{V,E,E0,A,B,C}
	LAC V,BODY
L1:	PVT V,V↔CAMN V,BODY↔POP1J
	PED E,V↔SKIPN E0,E↔POP1J   ;VERTEX BODY CASE.
	SETZB 0,A↔SETZB B,C
L2:	FAD A,AA(E)↔FAD B,BB(E)↔FAD C,CC(E)
	PVT 1,E↔CAME 1,V↔GO .+3↔PCW E,E↔GO .+5
	NVT 1,E↔CAME 1,V↔AOJA .+5↔NCW E,E
	CAME E,E0↔AOJA L2↔AOS
	FLOAT↔FDV A,↔FDV B,↔FDV C,
	DAC A,XPP(V)↔DAC B,YPP(V)↔DAC C,ZPP(V)
	GO L1
ENDR VNORM;1/14/73(BGB)----------------------------------------------
SUBR(ZCLIPF,FACE)
COMMENT ⊗------------------------------------------------------------
⊗↔	GO L0
	DECLARE{F,E,V,V1,V2,U0,U1,U2,ENEW,F0}
	EXTERN MKFE,ESPLIT
;GET A PZZ VERTEX OF F0  -  PZZ ≡ BEHIND THE CAMERA.
L0:	LAC 1,FACE
	DAC 1,F0↔DAC 1,U1↔DAC 1,F
	PED 0,1↔DAC E

L1:	SETQ(E,{ECCW,E,F})
	SETQ(V,{VCCW,E,F})
	TEST 1,PZZ↔GO L1

;GET FIRST NZZ VERTEX CCW AROUND F FROM E  -  NZZ ≡ INVIEW.
L2:	SETQ(E,{ECCW,E,F})
	SETQ(V,{VCCW,E,F})
	TEST 1,NZZ↔GO L2

;MAKE Z-CLIP VERTEX.
	LAC 1,E↔PVT 0,1↔CAMN 0,V↔GO .+3↔CALL(INVERT,E)
	PVT 0,1↔DAC V1
	NVT 0,1↔DAC V2
	SETQ(U2,{ESPLIT,E})
	LAC 1,U2↔MARK 1,TMPBIT
	LAC 1,E↔TEST 1,DARKEN↔GO[
	LAC 1,U2↔MARK 1,DARKEN↔GO .+1]
	CALL(ZCLIP,V1,U2,V2)
	CALL(UNPROJECT,U2)
	LAC 1,U2↔MARK 1,NZZ

;MAKE Z-CLIP EDGE.
L3:	LAC 1,U1↔TEST 1,VBIT↔GO L4	;U1 IS FACE ON 1ST TIME THRU.
	SETQ(ENEW,{MKFE,U1,F,U2})
	LAC 2,ENEW↔NFACE 1,2
	MARK  1,PZZ
	MARK 2,TMPBIT
	LAC 1,F↔MARKZ 1,PZZ
	MARK  1,NZZ
	CAMN  1,F0↔POP1J		;  .......EXIT.
	NFACE 1,2↔DAC 1,F
	MARK  1,PZZ
	GO .+3
L4:	LAC U2↔DAC U0

;ADVANCE INTO THE NEXT FACE.
	LAC U2↔DAC U1
	SETQ(F,{OTHER,E,F})
	CAME 1,F0↔GO L2
	LAC U0↔DAC U2↔GO L3
ENDR ZCLIPF;1/14/73(BGB)---------------------------------------------
SUBR(FMRK,WORLD)		;MARK POTENT FACES.
COMMENT ⊗------------------------------------------------------------
⊗↔	ACCUMULATORS{W,B,F,Q,R}

;INITIALIZE THE WORLD'S POTENTIALLY VISIBLE FACE AND EDGE LISTS.
	LAC 1,WORLD↔ZAC
	PFACE. 0,1↔PED. 0,1↔NED. 0,1

;FOR ALL THE BODIES OF THE WORLD.
	LAC B,WORLD↔DAC B,BODY#
L1:	LAC B,BODY↔CCW B,B↔DAC B,BODY
	CAMN B,WORLD↔POP1J
	PED 1,B↔TEST 1,EBIT↔POP1J	;DON'T LOOK AT SINGLE POINTS

;FOR ALL THE FACES OF EACH BODY.
	LAC F,B
L2:	PFACE F,F↔DAC F,FACE#
	CAMN F,BODY↔GO L1
	HIDE F
	TEST F,NZZ↔GO L2	;FACE IS FULLY BEHIND THE CAMERA.
	TEST F,PZZ↔GO L3	;FACE IS PARTIALLY IN VIEW.
	CALL(ZCLIPF,F)		;DO Z-CLIPPING.
	LAC F,FACE
L3:	CALL(FACOEF,F,[-1])	;FLG=-1 FOR PP COORDINATES.
	LAC F,FACE
	LAC CC(F)↔FMPR LDZ
	CAML KK(F)↔GO L2	;FACE HAS BACKSIDE TOWARDS CAMERA.

;POTENTIALLY VISIBLE FACE.
L4:	MARK F,POTENT
	MARKZ F,TBIT1
	LAC 1,WORLD↔PFACE 0,1
	POTEN. 0,F↔PFACE. F,1
	GO L2
ENDR FMRK;1/14/73(BGB)-----------------------------------------------

SUBR(EMRKALL,WORLD)			;MARK ALL EDGE AS POTENT.
COMMENT ⊗------------------------------------------------------------
⊗↔	ACCUMULATORS{B,E}
;FOR ALL THE BODIES OF THE WORLD.
	LAC B,WORLD
L1:	CCW B,B↔CAMN B,WORLD↔POP1J
;FOR ALL THE EDGES OF EACH BODY.
	LAC E,B
L2:	PED E,E↔CAMN E,B↔GO L1
	MARK E,POTENT↔GO L2
ENDR EMRKALL;1/14/73(BGB)--------------------------------------------
SUBR(EMRK,WORLD)		;MARK POTENT EDGES FOR OCCULT.
COMMENT ⊗------------------------------------------------------------
⊗↔	ACCUMULATORS{Q,R,S,B,F1,F2,E,A}
	ACCUMULATORS{V1,V2}
	DZM FOLDCNT↔DZM EDGECNT
;FOR ALL THE BODIES OF THE WORLD.
	LAC B,WORLD
L1:	CCW B,B↔CAMN B,WORLD↔POP1J
;FOR ALL THE EDGES OF EACH BODY.
	LAC E,B
L2:	PED E,E↔CAMN E,B↔GO L1
	DZM↔POTEN. 0,(E)
	MARKZ E,FOLDED+VISIBLE+POTENT
	PFACE F1,E
	NFACE F2,E

;WHEN EITHER FACE IS POTENT THEN THE EDGE IS POTENT.
	LAC(F1)↔IOR(F2)↔TLNN(POTENT)↔GO L2
	MARK E,POTENT
;CONS THE EGDE INTO THE WORLD'S POTENTIALLY VISIBLE EDGE LIST.
	LAC 1,ARG1↔PED 0,1↔SKIPN↔NED. E,1
	PED. E,1↔POTEN. 0,E↔ZIP 7(E)
	AOS EDGECNT↔CALL(ECOEF,E)
	MARK V1,POTENT↔IORM(V2)
	CAR 7(V1)↔AOS↔DIP 7(V1)	;VALENCE.
	CAR 7(V2)↔AOS↔DIP 7(V2)	;VALENCE.

;WHEN ONLY ONE FACE IS POTENT THEN EDGE IS FOLDED.
	LAC(F1)↔XOR(F2)↔TLNN(POTENT)↔GO L2
	TEST F1,POTENT↔GO[CALL(INVERT↑,E)↔GO .+1];NOTA BENE !
	MARK E,FOLDED↔IORM(V1)↔IORM(V2)
	GO L2
ENDR EMRK;1/14/73(BGB)-----------------------------------------------

;COMPUTE NORMALIZED EDGE COEFFICIENTS.
SUBR(ECOEF,EDGE)
COMMENT ⊗------------------------------------------------------------
⊗↔	ACCUMULATORS{V1,V2,S,B,F1,F2,E,A,FLG}	;BUT ONLY V1,V2,E,S.
	LAC E,EDGE↔NVT V1,E↔PVT V2,E
	LAC YPP(V2)↔FSBR YPP(V1)↔DAC AA(E)↔FMPR↔DAC 1
	LAC XPP(V1)↔FSBR XPP(V2)↔DAC BB(E)↔FMPR↔FADR 1,0
	LAC XPP(V2)↔FMPR YPP(V1)
	LAC S,XPP(V1)↔FMPR S,YPP(V2)↔FSBR S↔DAC CC(E)
	CALL(SQRT↑,1)↔SLACI(<1.0>)↔FDVR 0,1
	FMPRM AA(E)↔FMPRM BB(E)↔FMPRM CC(E)
	POP1J
ENDR ECOEF;7/23/73(BGB)----------------------------------------------
SUBR(ZCLIP)V1,U,V2
COMMENT ⊗------------------------------------------------------------
⊗↔	F←0 ↔ U←1
	ACCUMULATORS{V1,V2,X1,Y1,Z1,X2,Y2,Z2}
	SAVAC(11)

;V1 BEHIND CAMERA PLANE, V2 VEFORE CAMERA PLANE.
	CDR V1,ARG3
	CDR  U,ARG2
	CDR V2,ARG1
	LAC F,FOCAL

;UNPROJECT TO CAMERA CENTERED COORDINATES.
	FOR @$ I←1,2{
	MOVN Z$I,SCALEZ↔ FDVR Z$I,ZPP(V$I)
	LAC Y$I,Z$I↔ FMPR Y$I,YPP(V$I)↔ FDVR Y$I,SCALEY
	LAC X$I,Z$I↔ FMPR X$I,XPP(V$I)↔ FDVR X$I,SCALEX}

;PIERCE Z=-FOCAL PLANE BY SIMILAR TRIANGLES & REPROJECT.
	FSBR X1,X2↔ FSBR Y1,Y2↔ FSBR Z1,Z2
	FADR Z2,F↔MOVNS Z2

	FMPR X1,Z2↔FDVR X1,Z1↔FADR X1,X2
	FMPR X1,SCALEX↔FDVR X1,F↔DACN X1,XPP(U)

	FMPR Y1,Z2↔FDVR Y1,Z1↔FADR Y1,Y2
	FMPR Y1,SCALEY↔FDVR Y1,F↔DACN Y1,YPP(U)
	LAC 2,SCALEZ↔FDVR 2,F↔DAC 2,ZPP(U)

;MARK U'S NSEW BITS.
	ACCUMULATORS{XX,YY}
	LAC XX,XPP(U)↔FMPR XX,MAG↔FADR XX,SOX↔XDC. XX,U↔HLLES
	LAC YY,YPP(U)↔FMPR YY,MAG↔FADR YY,SOY↔YDC. YY,U↔HLLES
	TYPE 0,U↔TRZ(NSEW);NSEW RESET.
	CAMLE YY,YH↔TRO(NORTH)
	CAMGE YY,YL↔TRO(SOUTH)
	CAMLE XX,XH↔TRO(EAST)
	CAMGE XX,XL↔TRO(WEST)
	TRZ(PZZ)↔TRO(NZZ)
	TYPE. 0,U

	GETAC(11)
	POP3J
ENDR;1/14/73(BGB)------------------------------------------------------
SUBR(XYCLIP)
COMMENT ⊗------------------------------------------------------------
	XY-CLIPPER, skips when portion is visible;
	expect arguments in accumulators V1 & V2;
	returns results via accumulator PTR.
⊗
	ACCUMULATORS{E,V1,V2,X1,Y1,X2,Y2,PTR}

;GET NSEW BITS.
	LDB 0,[POINT 4,(V1),8];
	LDB 1,[POINT 4,(V2),8];
	TRNE 0,(1)↔POP0J			;EASY OUTSIDER.
	XDC X1,V1↔YDC Y1,V1			;GET ENDS' LOCII.
	XDC X2,V2↔YDC Y2,V2

;EASY INSIDER VERTICES.
	JUMPE 0,[LAC X1↔FIXX↔DIP(PTR)
	 LAC Y1↔FIXX↔DAP(PTR)↔AOBJN PTR,.+1]
	JUMPE 1,[LAC X2↔FIXX↔DIP(PTR)
	 LAC Y2↔FIXX↔DAP(PTR)↔AOBJN PTR,.+1↔GO L]

;COMPUTE EDGE COEFFICIENTS.
	LAC Y1↔FSBR Y2↔DAC A
	LAC X2↔FSBR X1↔DAC B
	LAC X2↔FMPR Y1↔MOVNM C
	LAC X1↔FMPR Y2↔FADRM C

;PARTIAL PRODUCTS.
	LAC A↔FMPR XH↔DAC AXH
	LAC A↔FMPR XL↔DAC AXL
	LAC B↔FMPR YH↔DAC BYH
	LAC B↔FMPR YL↔DAC BYL

;CORNER Q'S.
	SETOM FLGO↔SETZM FLGZ
	LAC AXH↔FADR BYH↔FADR C↔DAC QNE↔ANDM FLGO↔IORM FLGZ
	LAC AXL↔FADR BYH↔FADR C↔DAC QNW↔ANDM FLGO↔IORM FLGZ
	LAC AXL↔FADR BYL↔FADR C↔DAC QSW↔ANDM FLGO↔IORM FLGZ
	LAC AXH↔FADR BYL↔FADR C↔DAC QSE↔ANDM FLGO↔IORM FLGZ

;HARD OUTSIDER CASES.
	SKIPGE FLGO↔POP0J
	SKIPL